#include "ringQueue.hpp"
#include <unistd.h>

void *Productor(void *args)
{
    RingQueue<int> *rq = (RingQueue<int> *)args;

    while (true)
    {
        sleep(1);
        // 生产任务
        static int task = 1;
        rq->push(task);
        // 打印日志
        std::cout << "生产：" << task++ << std::endl;
    }

    return nullptr;
}

void *Consumer(void *args)
{
    RingQueue<int> *rq = (RingQueue<int> *)args;

    while (true)
    {
        sleep(1);
        // 获取任务
        int task;
        rq->pop(&task);
        std::cout << "消费：" << task << std::endl;
    }

    return nullptr;
}

int main()
{
    // 创建循环队列
    RingQueue<int> *rq = new RingQueue<int>();

    // // 创建线程
    // pthread_t ctid, ptid;
    // pthread_create(&ctid, nullptr, Consumer, (void *)rq);  // 消费线程
    // pthread_create(&ptid, nullptr, Productor, (void *)rq); // 生产线程

    // // 回收线程
    // pthread_join(ctid, nullptr);
    // pthread_join(ptid, nullptr);

    // 多线程
    pthread_t c[3], p[2];
    pthread_create(c, nullptr, Consumer, (void *)rq);
    pthread_create(c + 1, nullptr, Consumer, (void *)rq);
    pthread_create(c + 2, nullptr, Consumer, (void *)rq);

    pthread_create(p, nullptr, Productor, (void *)rq);
    pthread_create(p + 1, nullptr, Productor, (void *)rq);

    for (int i = 0; i < 3; i++)
        pthread_join(c[i], nullptr);
    for (int i = 0; i < 2; i++)
        pthread_join(p[i], nullptr);

    delete rq;

    return 0;
}